/**
 * Constantes para la validacion de el ingreso de alimentos al menu
 * @author Mauricio Chamorro <mrchamorro@utn.edu.ec>
 */

var contadorExcesoNutrientesMacro = 0;
var contadorDeficitNutrientesMacro = 0;
var contadorExcesoNutrientesMicro = 0;
var contadorDeficitNutrientesMicro = 0;
var cantidadVariantesMenu = 0;
//objeto en el cual esta el dropdown para elegir la variable de menu
listaVarianteMenu = '';
//objeto que se usa para almacenar los rangos de los nutrientes
var rangosNutrientes = [];
//boolean que indica el cambio de update
var moneda = false;
// boolean indica si ya se actualizo la vista con valores update
var $updated = false;
// variable que recopila informacio acerca de los valores nutricionales
var $texto = '';
/**
 * Permite el manejo para la asignacion de alimentos al menu nutricional
 * @author Mauricio Chamorro <mrchamorro@utn.edu.ec>
 * @returns {undefined}
 */
$(function() {
    //valida que no existan exceso o deficiencia de macrnutrientes
    $('#btnSaveCartaAlimentos').on("click", function(event) {
        if (modoRestrictivo()) {
            if (contadorExcesoNutrientesMacro != 0 || contadorDeficitNutrientesMacro != 0) {
                event.preventDefault();
                bootbox.alert("<center><p> Revise los valores nutricionales, \n\
            para poder guardar los datos, si existen deficiencia o exceso en estos, \n\
            el men&uacute; no puede ser creado</p></center>");
            } else {
                $("#btnSaveCartaAlimentos").attr('disabled', false);
            }
        }
        if (!validadorVariantesMenu()) {
            event.preventDefault();
            bootbox.alert("<center><p> Revise las variantes de men&uacute;, no pueden existir repetidos </p></center>");
        }
        if (!validadorVariantesCompletas()) {
            event.preventDefault();
            bootbox.alert("<center><p> Revise la cantidad de alimentos, este debe coincidir con la cantidad de variantes de men&uacute;. </p></center>");
        }
    });

    $('#modoRestrictivo').on('change', function() {
        if ($('#modoRestrictivo').is(':checked')) {
            bootbox.alert("<center><p> Al activar este modo, los macronutrientes\n\
         deberan ser ingresados dentro de los rangos permitidos </p></center>");
        }
    })

    $id_carta_alimentos = $("#CartaAlimentos_carta_nutricional_id").val();

    //cuando sea update
    if ($id_carta_alimentos != '') {

        url = '/index.php/../../carta/cartaAlimentos/getAlimentosMenu';
        //carga los alimentos del menu
        $.ajax({
            beforeSend: function() {
                verCargandoDatosModal();
                tipoVariante = $('#CartaAlimentos_tipoCarta').val();
                //carga las variantes del menu para ese tiempo de comida
                cargarVariantesMenu();
            },
            type: "GET", //GET or POST or PUT or DELETE verb
            url: baseUrl + url,
            data: {
                id: $id_carta_alimentos,
            }, //Data sent to server
            dataType: "json"})
                .success(function(info) {//On Successful service call
//                 obtiene el tiempo de comida
                    tipoVariante = $('#CartaAlimentos_tipoCarta').val();
//                carga los rangos de los nutrientes segun el tiempo de comida 
//                y la edad
                    cargarRangoNutrientes(tipoVariante);
                    sumaValoresNutricionales(moneda);
                    moneda = true;
//                  //ingresa los alimentos
                    ingresarAlimentos(info);
                }).
                error(function(info) {//On Successful service call
                    alert("en mantenimiento");
                }
                );

//        validadorTiempoComidaEdad();

    } else {
        // es crear
        // inicio estilos
        if ($('#CartaAlimentos_tipoCarta').val() != '' && $('#CartaAlimentos_tipoCarta').text() != ' -- Seleccione -- ') {
            $('#edades').show();
            $('#busqueda').show();
            $('#tablaAlimentos').show();
            $('#btnIngresas').show();
            $('#ingresoAlimentos').show();
            $('#Carta').show();
            $('#btnAction').show();
        }
        $('#edades').hide();
        $('#busqueda').hide();
        $('#tablaAlimentos').hide();
        $('#btnIngresas').hide();
        $('#ingresoAlimentos').hide();
        $('#Carta').hide();
        $('#btnAction').hide();
        $('div.box.span3').remove();
        $('div.row-fluid.sortable.span9.ui-sortable').removeClass('span9').addClass('span12');
        $("#btnSaveCartaAlimentos").attr('disabled', true);
        //fin estilos

        validadorTiempoComidaEdad();
    }
    $('#btnIngresas').on('click', function(e) {
        e.preventDefault();
        ingresarAlimentos('');
    });
    $('#btnDelete').on('click', function(e) {
        e.preventDefault();
    });
});

/**
 * Carga los rangos de los nutrientes 
 * @author Mauricio Chamorro <mrchamorro@utn.edu.ec>
 * @param {int} tiempoComida
 * @returns {undefined}
 */
function cargarRangoNutrientes(tiempoComida) {
    if (tiempoComida != '') {
        $('#edades').show();
        $('#CartaAlimentos_edades_id').on('change', function() {
            $("#btnSaveCartaAlimentos").attr('disabled', true);
            //carga los rangos de valores nutricionales
            cargarRangosNutrientes();
            //si se eligio una edad
            if ($(this).val != '') {
                $('#busqueda').show();
                $('#tablaAlimentos').show();
                $('#btnIngresas').show();
                $('#ingresoAlimentos').show();
                $('#Carta').show();
                $('#btnAction').show();
            }
        });
        cargarRangosNutrientes();
    }
    else {
//           TODO generar alertas de selecion para validar menu  
    }
}

/**
 * Crea un dropdown con las variantes de menu segun el tiempo de comida
 * @author Mauricio Chamorro <mrchamorro@utn.edu.ec>
 * @returns {undefined}
 */
function cargarVariantesMenu() {
    //construccion dropdown de variantes menu
    url = '/index.php/../../carta/variantesCarta/cargarVariantesMenu';
    $.getJSON(baseUrl + url + "/tipoVariante/" + tipoVariante, function(info) {
    })
            .done(function(info) {
                cantidadVariantesMenu = info.length;
                options = '';
                $.each(info, function(key, value) {
                    options += "<option value='" + value['id'] + "'>" + value['representacion'] + '</option>';
                });
                //crea el dropdown con los variantes de menu
                listaVarianteMenu = "<select variante='variante' style='width:100px'>"
                        + options +
                        "</select>"
                        ;
            });
}


/**
 * Ingresa los alimentos seleccionados a la tabla  html
 * @author Mauricio Chamorro <mrchamorro@utn.edu.ec>
 * @param {String} acumuladorList : si acumulador list es '' quiere decir 
 * que es un nuevo menu caso contrario es un tipo update
 * @returns {undefined}
 */
function ingresarAlimentos(acumuladorList) {
    //string que contiene los ids de los alimentos separados por comas
    acumulador = "";
    $("#alimentos_menu-grid table tbody input:checked").each(//todo hacer funcion para usar 
            function() {
                acumulador += "," + $(this).attr("value");
                $(this).prop('checked', false); //desactiva la casilla

            }
    );
    if (acumuladorList != '') {
        acumulador = acumuladorList;
    }
    //si el objeto que se obtiene del selgriview es vacio quiere decir que no selecciono objetos
    if (acumulador != '') {
        url = '/index.php/../../nutricion/alimentos/ingresarAlimentos';
        //realiza el ingreso de los alimentos en su respectiva tabla
        $.getJSON(baseUrl + url + "/lista/" + acumulador, function(info) {
        })
                .success(function(info) {
                    listaDropdown = '';
                    tableBody = '';
                    //obtiene la lista de alimentos en el html
                    $.each(info, function(key, value) {
                        options = '';
                        //crea los elementos del dropdown con las porciones del alimento respectivo
                        $.each(value['porciones'], function(key2, value2) {
                            options += "<option  value='" + value2['cantidad_g'] + "'>" + value2['descripcion'] + '</option>';
                        });
                        //agrega la opcion otra si desea ingresar otro valor en la porcion del alimento
                        options += "<option  value=''>" + "otra" + "</option>";
                        //crea el dropdown para las porciones de dicho alimento
                        listaDropdown = "<select porcion='porcion' style='width:110px'>" + options + "</select>";
                        //valida si existen alimentos repetidos en el menu
                        if (validadorElementosRepetidos(value['id'])) {
                            setJNotifycationOk("Se ha ingresado:" + value['nombre']);
                            //adiere una nueva fila del alimento nuevo
                            tableBody += '<tr id="alimento_' + value['id'] + '">' +
                                    '<td >'
                                    + listaDropdown +
                                    '</td>' +
                                    '<td>'
                                    + '<input class="inputNumeric"  cantidad="cantidad" style="width:100px" id="txt_' + value['id'] + '" value="' + value['porciones'][0]['cantidad_g'] + '" name="CartaAlimentos[cantidad][' + value['id'] + '][value]" type="text">' +
                                    '</td>' + '<td>' + listaVarianteMenu + ' </td>'
                                    + '<td>' + value['nombre'] + '</td>' +
                                    ' <td><a class="delete" id="btnDelete" onclick="borrarAlimento(' + value['id'] + ');"><i title="eliminar" class="icon-trash"></i></a></i></td></tr>';
                        }
                    });
                    //agrega los nuevos alimentos a la tabla actual de alimentos
                    $('#cuerpoTableSeleccionado').append(tableBody);
                    sumaValoresNutricionales(true);
                    //TRIGERS
                    $(".inputNumeric").numeric({decimal: ".", negative: false, decimalPlaces: 2, });

                    $('#ingresoAlimentos select[porcion^="porcion"]').each(function(index) { //da el id a los dropdowns
                        idn = $(this).parent().parent().attr('id');
                        idn = idn.substr(9, idn.length);
                        $(this).attr("id", "dropdownId_" + idn);
                        $(this).attr("name", "CartaAlimentos[medida][" + idn + "][" + $('#dropdownId_' + idn + ' option:selected').text() + "]");
                    });
                    $('#ingresoAlimentos select[variante^="variante"]').each(function(index) { //da el id a los dropdowns
                        idn = $(this).parent().parent().attr('id');
                        idn = idn.substr(9, idn.length);
                        $(this).attr("id", "varianteId_" + idn);
                        $(this).attr("name", "CartaAlimentos[variante][" + idn + "][" + $('#varianteId_' + idn).val() + "]");
                    });

                    $('#ingresoAlimentos select[variante^="variante"]').unbind("change");
                    $('#ingresoAlimentos select[variante^="variante"]').on('change', function() {
                        idn = $(this).parent().parent().attr('id');
                        idn = idn.substr(9, idn.length);
                        $(this).attr("name", "CartaAlimentos[variante][" + idn + "][" + $('#varianteId_' + idn).val() + "]");
                    })

                    $('#cuerpoTableSeleccionado input[cantidad^="cantidad"]').unbind("blur");
                    $('#cuerpoTableSeleccionado input[cantidad^="cantidad"]').on('blur', function() {
                        idn = $(this).parent().parent().attr('id');
                        idn = idn.substr(9, idn.length);
                        $("#dropdownId_" + idn + " option").last().attr("selected", true);
                        $("#dropdownId_" + idn + " option").last().attr("value", $(this).val());
                        $("#dropdownId_" + idn + " option").parent().attr("name", "CartaAlimentos[medida][" + idn + "][otra]");

                    });
                    $('#ingresoAlimentos select[porcion^="porcion"]').unbind("change");  //elimina el vento change de los dropdowns, para q no se repita en la nuevacarga del evento
                    $('#ingresoAlimentos select[porcion^="porcion"]').on('change', function() { // da el evento de cambiar el input a cada fila
                        idn = $(this).parent().parent().attr('id');
                        idn = idn.substr(9, idn.length);
                        $(this).attr("name", "CartaAlimentos[medida][" + idn + "][" + $('#dropdownId_' + idn + ' option:selected').text() + "]"); // pone el name cada vez q cambie para el envio de post
                        $("#txt_" + idn).val($(this).attr('value')); //al cambiar el dropdown cambia el inpput
                        sumaValoresNutricionales(true);
                    });
                    $('#ingresoAlimentos input').unbind("change");
                    //fin triggers
                    $('#ingresoAlimentos input').on('change', function() {
                        sumaValoresNutricionales(true);
                    });
                })
                .error(function() {
                    setJNotifycationOk("Se ha encontrado un error, verifique que la categor&acute;a del alimento tiene por defecto 100 gramos");
                })
                .complete(function() {
                    if ($id_carta_alimentos != '' && $updated == false) {
                        updateInfoAlimentosSeleccionados($id_carta_alimentos);
                        $updated = true
                    }
                })
    }
}

/**
 * Permite eliminar un alimento del menu
 * @author Mauricio Chamorro <mrchamorro@utn.edu.ec>
 * @param {int} id
 * @returns {undefined}
 */
function borrarAlimento(id) {
    $("#alimento_" + id).remove();
    sumaValoresNutricionales(true);
}
/**
 * Suma los valores nutricionales, tomando los alimentos desde la tabla alimentos html
 * @author Mauricio Chamorro <mrchamorro@utn.edu.ec>
 * @param {boolean} isCreate: true es create, false es update
 * @returns {undefined}
 */
function sumaValoresNutricionales(isCreate) {
    listaAlimentos = '';
    if (isCreate) {
        alimentos = $('#cuerpoTableSeleccionado tr').each(function(index) {
            listaAlimentos += "," + ($(this).attr('id')).substr(9, ($(this).attr('id')).length) + "-" + $('#txt_' + ($(this).attr('id')).substr(9, ($(this).attr('id')).length)).val();//concatenar con los gramos
        });
        busquedaValoresNutriLista(listaAlimentos);
    }
    else {
        url = '/index.php/../../carta/cartaAlimentos/getAlimentosPorcionesMenu';
        $.getJSON(baseUrl + url + "/id/" + $id_carta_alimentos,
                function(info) {
                })
                .done(function(info) {
                    //    envia un string creado con el id del alimento y con la cantidad de gramos este
                    busquedaValoresNutriLista(info);
                });
    }
}
/**
 * Encuentra los valores nutricionales de una lista de alimentos y crea la tabla
 * con los valores y rangos de cada valor nutricional
 * @author Mauricio Chamorro <mrchamorro@utn.edu.ec>
 * @param {String} lista : separado por (,)
 * @returns {undefined}
 */
function busquedaValoresNutriLista(lista) {
    url = '/index.php/../../nutricion/alimentos/sumatoriaValoresNutricionales';
    //realiza la suma de los valores nutricionales de cada alimento
    contadorExcesoNutrientesMacro = 0;
    contadorDeficitNutrientesMacro = 0;
    contadorExcesoNutrientesMicro = 0;
    contadorDeficitNutrientesMicro = 0;
    $.getJSON(baseUrl + url + "/lista/" +
            lista, function(info) {
            })
            .done(function(info) {
                //On Successful service call
                if (info) {
                    cuerpoTabla = '';
                    //limpia la de valores nutricionales
                    $('#cuerpoTableRangosNutrientes tr').remove();
                    //construye el panel de visualizacion para cada valor nutricional
                    $.each(info, function(key, value) {
                        indicador = ''; // para darle estilos a la columna del nombre del nutriente
                        //Semaforizacion de valores nutricionales y calculos de adecuacion de minimos y maximos
                        var filaValorApreciacion = alertasValoreNutricionales(rangosNutrientes[key]['max'], rangosNutrientes[key]['min'], value, key);
                        var NRangoMax = filaValorApreciacion[1];
                        filaValorApreciacion = filaValorApreciacion[0];

                        if (key == 'grasa_total_g' ||
                                key == "acidos_grasos_saturados_g" ||
                                key == "acidos_grasos_poliinsaturad_g" ||
                                key == "acidos_grasos_monoinsat_g") { // transforma de g a kcal los 3 nutrientes
                            value = (value * 9).toFixed(2);
                        }
                        else if (key == "proteinas_g" || key == 'carbohidratos_g') {
                            value = (value * 4).toFixed(2);
                        }
                        porcentaje = (value * 100 / NRangoMax).toFixed(2);
                        cuerpoTabla += '<tr>' +
                                '<td style="' + indicador + '">' + UtilGetUnidadMedidaValNutricional(key) + '</td>' +
                                '<td class"span4">' +
                                '<label id=' + 'label' + key + '>' + UtilCambioNombreValNutricional(key) + "= " + value + '</label>' +
                                '</td>' +
                                '<td class="span3">' +
                                '<div style="height:20px"  class="ui-progressbar ui-widget ui-widget-content ui-corner-all" role="progressbar" aria-valuemin="0" aria-valuemax="100" aria-valuenow="90">' +
                                '<div  id="' + key + '"  class="ui-progressbar-value ui-widget-header ui-corner-left" style="width:' + porcentaje + '%; background:' + colorRandomico() + ';position: relative;">' +
                                "<span style='text-shadow: black 0.1em 0.1em 0.2em;color: white !important;font-size: inherit !important;position: static;float: left;'>" + porcentaje + '%' + "  </span>" +
                                '</div>' +
                                '</div>' +
                                '</td>' +
                                filaValorApreciacion +
                                '</tr>'
                                ;
                    }
                    );
                    indicador = '';
//                agrega la tabla construida a la pagina
                    $('#cuerpoTableRangosNutrientes').append(cuerpoTabla);
                }
                else {
                    // si ya no hay alimentos para calcular en la lista , entncs vacia todo
                    $('#cuerpoTableRangosNutrientes tr').remove();
                }
            }).complete(function() {
        if ($texto != '') {
            bootbox.alert("<center>" + $texto + "</center>");
            $texto = '';
        }
    }
    );
}
/**
 * Metodo que obtiene los ids de los alimentos ingresados obteniendolos desde la tabla 
 * alimentos
 * @param {boolean} isCreate description
 * @author Mauricio Chamorro <mrchamorro@utn.edu.ec>
 * @returns {Array}
 */
function listadoAlimentosCreados(isCreate) {
    listaAlimentos = [];
    if (isCreate) {
        alimentos = $('#cuerpoTableSeleccionado tr').each(function(index) {
            listaAlimentos.push($(this).attr('id').substr(9, ($(this).attr('id')).length));
        });
    }
    else {

    }
    return (listaAlimentos);
}
/**
 * Controla que esten elegida una edad y un tiempo de comida, ademas de cargar
 * los rangos de los nutrientes segun esa edad y ese tiempo de comida
 * @author Mauricio Chamorro <mrchamorro@utn.edu.ec>
 * @returns {undefined}
 */
function cargarRangosNutrientes() {
    if ($('#CartaAlimentos_edades_id').val() != '' && $('#CartaAlimentos_tipoCarta').val() != '') {
        tipoComidaN = $('#CartaAlimentos_tipoCarta').val();
        edadN = $('#CartaAlimentos_edades_id').val();
        url2 = '/index.php/../../nutricion/alimentos/encontrarRangoNutrientes';
        setJNotifycationOk("Espere unos segundo mientras se recargan los cambios para los rangos de nutrientes");
        //obtiene los rangos de los nutrientes segun la edad y el tiempo de comida
        $.ajax({
            beforeSend: function() {
                verCargandoDatosModal();
            },
            type: "GET", //GET or POST or PUT or DELETE verb
            url: baseUrl + url2,
            data: {
                tiempoComida: tipoComidaN,
                edad: edadN,
            }, //Data sent to server
            dataType: "json"})
                .success(function(info) {//On Successful service call
//                    verCargandoDatosModal();
                    rangosNutrientes = info.rangosNutrientes;
                    setJNotifycationOk("<b>Carga de rangos de nutrientes exitosa, puede continuar</b>");
//                    cerrarCargandoDatosModal();
                    $("#btnSaveCartaAlimentos").attr('disabled', false);
                    sumaValoresNutricionales(false);
                })
                .complete(function() {
                    if (rangosNutrientes != '') {
                        cerrarCargandoDatosModal();
                    }
                })
                .
                error(function(info) {//On Successful service call
                    setJNotifycationOk("Ha ocurrido un error comuniquese con el administrador del sistema");
                }
                );

    } else {
        setJNotifycationOk("Escoja valores validos");
    }
}
function updateInfoAlimentosSeleccionados(id) {
    $.getJSON("getInfoAlimentosMenu/id/" + id, function(info) {
    })
            .done(function(info) {
                $.each(info, function(key2, value2) {
                    $('#cuerpoTableSeleccionado tr').each(function(index) {
                        if (key2 == ($(this).attr('id')).substr(9, ($(this).attr('id')).length)) {
                            $('#alimento_' + key2 + ' select[porcion^="porcion"] option[value="' + value2['2'] + '"]').attr("selected", true);
                            //TODO escger por el texto no por el value
                            $('#alimento_' + key2 + ' input[cantidad^="cantidad"]').val(value2['2']);
                            $('#alimento_' + key2 + ' select[variante^="variante"] option[value="' + value2['1'] + '"]').attr("selected", true);
                        }
                        else if (value2['0'] == 'otra') {
                            $("#dropdownId_" + key2 + " option").last().attr("selected", true);
                        }
                    });
                });
            });
}

